#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int son[N][26]; // 每个结点的子节点编号(数量)，每一个结点最多是26个(0~25),
int idx;        // 当前结点的标号
int cnt[N];     // 当前字符串的数量
char str[N];    // 输入的字符
void insert(char *str)
{
    int p = 0; // 标号为0的结点开始
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a'; // 字母转成数字(0~25)
        if (!son[p][u])
        {
            son[p][u] = ++idx; // son[0][0~25]没有该字母,就是创建该结点的子结点，数加1。
        }
        p = son[p][u]; // 赋值给p开始，开始下一个结点0-1-2-3...
    }                  // son[p][u] 字符结尾的结点数目给p
    cnt[p]++;
}
int query(char *str)
{
    int p = 0;
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if (!son[p][u])
        {
            return 0;
        }
        p = son[p][u];
    }
    return cnt[p];
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        char op[2];
        scanf("%s%s", op, str);
        if (*op == 'I')
            insert(str);
        else
            printf("%d\n", query(str));
    }

    return 0;
}